package com.guigu.gulicommon.tools;

import cn.hutool.core.date.DateUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import lombok.extern.log4j.Log4j2;

import java.util.Date;

/**
 * Jwt工具类
 *
 * @author 陈俊杰
 * @since 2024-8-3
 */
@Log4j2
public class JwtTool {
    /**
     * 生成token
     *
     * @param load       token载荷
     * @param key        token密钥
     * @param expireHour token过期时间，单位小时
     * @return token
     */
    public static String generateToken(String load, String key, int expireHour) {
        return JWT.create().withAudience(load) // 设置载荷
                .withExpiresAt(DateUtil.offsetHour(new Date(), expireHour)) // 设置token过期时间
                .sign(Algorithm.HMAC256(key)); // 设置Token解析密钥
    }

    /**
     * 获取token的载荷
     *
     * @param token token
     * @return token的载荷
     */
    public static String getLoad(String token) {
        String load;
        try {
            load = JWT.decode(token).getAudience().get(0);
        } catch (JWTDecodeException j) {
            load = null;
        }
        return load;
    }

    /**
     * 校验token
     */
    public static Integer verify(String token, String key) {
        try {
            JWT.require(Algorithm.HMAC256(key)).build().verify(token);
            return 0;// 验证通过
        } catch (TokenExpiredException e) {
            return 1;// 过期
        } catch (SignatureVerificationException e) {
            return 2;// 验证不通过
        }catch(Exception e){
            return 3;
        }
    }
}
